package com.fiuba.aterrizar.servidor.service.impl;

import com.fiuba.aterrizar.servidor.domain.Reserva;
import com.fiuba.aterrizar.servidor.domain.Vuelo;
import com.fiuba.aterrizar.servidor.dto.DatosParaReservaDTO;
import com.fiuba.aterrizar.servidor.exception.ReservaExistenteException;
import com.fiuba.aterrizar.servidor.exception.ReservaInexistenteException;
import com.fiuba.aterrizar.servidor.exception.ReservaInvalidaException;
import com.fiuba.aterrizar.servidor.exception.VueloInvalidoException;
import com.fiuba.aterrizar.servidor.service.ReservaService;
import java.util.Date;


public class ReservaServiceImpl implements ReservaService {

	/** Dada una reserva la efectiviza*/
	public void efectivizarReserva(String numeroTransaccion, String idUsuario) throws ReservaInexistenteException{
            String codigo = Reserva.generarCodigo(idUsuario,numeroTransaccion);                    
            Reserva reserva = Reserva.findByCodigo(codigo);
            if (reserva == null){
                throw new ReservaInexistenteException();
            }
            
            reserva.setFechaCompra(new Date());
            reserva.update();
        }

	/** Realiza la reserva*/
        public void reservar(DatosParaReservaDTO datosParaReservar) throws ReservaInvalidaException{
            //eliminar las reservas vencidas
            Reserva.eliminarReservasVencidas();
            //generar codigo
            String codigo = Reserva.generarCodigo(datosParaReservar.getIdUsuario(),datosParaReservar.getNumeroTransaccion());
            //validar si existe
            validarReservaExistente(codigo);
            //buscar el vuelo
            Vuelo vuelo = Vuelo.findByCodigo(datosParaReservar.getCodigoVuelo());
            if (vuelo == null){
                throw new VueloInvalidoException();
            }
            //reservar un asiento
            vuelo.reservarAsiento(datosParaReservar.getClaseVuelo());            
            //guardar la reserva
            Reserva reserva = new Reserva();
            reserva.setCodigo(codigo);
            reserva.setClase(datosParaReservar.getClaseVuelo());
            reserva.setFecha(new Date(System.currentTimeMillis()));            
            reserva.setCodigoUsuario(datosParaReservar.getIdUsuario());
            reserva.setCodigoVuelo(datosParaReservar.getCodigoVuelo());
            reserva.save();
        }

	/**Verifica que una reserva no se haya hecho previamente */
        private void validarReservaExistente(String codigo) throws ReservaExistenteException{
          Reserva reserva = Reserva.findByCodigo(codigo);

          if (reserva != null) {              
            throw new ReservaExistenteException();
          }          
        }
}